/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import model.Categoria;
import model.Fornecedor;
import model.Produto;
import utils.Conexao;
import utils.ExcecaoSCEV;


public class CategoriaDAO {
    private Produto umProduto;
     public List<Categoria> pegarTodos() throws ExcecaoSCEV {
        List<Categoria> Produtos = new ArrayList<Categoria>();
        Categoria umCategoria;
        Produto umproduto;
        DAOFactory daoFactory = new DAOFactory();
        FornecedorDAO fornecedorDAO = daoFactory.getFornecedorDAO();

        try {
            Connection db = Conexao.getConnection();
            Statement st = (Statement) db.createStatement();
            ResultSet rs = st.executeQuery(
                "SELECT  cod_produto,descricao,album,genero,tipo,preco,precocusto,quantidade,cod_fornecedor FROM produto");
            while (rs.next()) {
                umCategoria = new Categoria();
                umCategoria.setCodigoCategoria(rs.getInt(1));
                umCategoria.setDescricaoCategoria(rs.getString(2));
                umCategoria.setPrecoCategoria(rs.getString(3));
                umProduto = new Produto();
                umProduto.setCodigoProduto(rs.getInt(4));
                produtoDAO.carregar(umProduto);
                umCategoria.setCategoria(umCategoria);
                Categorias.add(umCategoria);


            }
            rs.close();
            st.close();

        } catch (SQLException ex) {
            throw new ExcecaoSCEV("Erro ao listar as Categorias. Código " +
                        ex.getSQLState() +
                        "\nDescricao " +
                        ex.getMessage());
        }
        return Categorias;
    
    
        public void incluir(Categoria Categoria) throws ExcecaoSCEV {
        try {
            Connection db = Conexao.getConnection();
            PreparedStatement st =
                db.prepareStatement("insert into categoria ("+
                "cod_categoria,descricao_categoria,preco_categoria,cod_produto) values (?,?,?,?)");

            st.setInt(1, Categoria.getCodigoCategoria());
            st.setString(2, Categoria.getDescricaoCategoria());
            st.setString(3, Categoria.getPrecoCategoria());
            st.setInt(4, Categoria.getProduto().getCodigoProduto());
            st.executeUpdate();
            st.close();
        } catch (SQLException ex) {
            if (ex.getSQLState().equals("23505")) {
                throw new ExcecaoSCEV("Categoria duplicada.");
            } else {
                throw new ExcecaoSCEV("Erro na inclusão de categoria. Código " +
                        ex.getSQLState() +
                        "\nDescricao " +
                        ex.getMessage());
            }
        }

    }

    public void alterar(Categoria Categoria) throws ExcecaoSCEV {
        try {
            Connection db = Conexao.getConnection();
            PreparedStatement st =
                    db.prepareStatement(
"update produto set cod_categoria=?, descricao_categoria=?,preco_categoria=?, cod_produto=?,cod_produto=? where cod_categoria=?");

            st.setInt(1, Categoria.getCodigoCategoria());
            st.setString(2, Categoria.getDescricaoCategoria());
            st.setString(3, Categoria.getPrecoCategoria());
            st.setInt(4, Categoria.getProduto().getCodigoProduto());

            st.executeUpdate();
            st.close();
        } catch (SQLException ex) {
            throw new ExcecaoSCEV("Erro na alteração da Categoria.  Código " +
                        ex.getSQLState() +
                        "\nDescricao " +
                        ex.getMessage());
        }
    }
    

    public void excluir(Categoria Categoria) throws ExcecaoSCEV {
        try {
            Connection db = Conexao.getConnection();
            PreparedStatement st =
                    db.prepareStatement("delete from Categoria where cod_categoria = ? ");
            st.setInt(1, Categoria.getCodigoCategoria());
            st.executeUpdate();
            st.close();
        } catch (SQLException ex) {
           if (ex.getSQLState().equals("23503")) {
                throw new ExcecaoSCEV("Categoria possuído por Produto.");
            }   else{
                   throw new ExcecaoSCEV("Erro na exclusão da Categoria.  Código " +
                        ex.getSQLState() +
                        "\nDescricao " +
                        ex.getMessage());
            }
        }
    }
}
    
  